package com.lq.learningTest.File;

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
import org.junit.Test;

import java.io.*;

public class FileTest{

    @Test
    /**
     * 文件拷贝
     */
    public void FileTest(){

//        InputStream inputStream = null;
//        FileOutputStream outputStream = null;
//
//        //和Thread一样，需要处理异常
//        try {
//            //建立文件输入流
//            inputStream = new FileInputStream("C:\\Users\\17675\\Desktop\\222.jpg");
//            //建立文件输出流
//            outputStream = new FileOutputStream("C:\\Users\\17675\\Desktop\\333.jpg");
//
//            long start = System.currentTimeMillis();
//            //一个字节接着一个字节的读
//            //一边读流中的字节，一边写出到文件
//            //用时3ms
////        int b;
////        while((b = inputStream.read())!= -1){
////            outputStream.write(b);
////        }
//
//            //1M接着1M的读
//            //用时1ms
//            byte[] buf = new byte[1024*1024];
//            int len;
//            while((len = inputStream.read(buf)) != -1){
//                //从buf当中读，每回从0开始写到第len个
//                outputStream.write(buf, 0, len);
//            }
//
//            long end = System.currentTimeMillis();
//            System.out.println(end - start);
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (inputStream != null) {
//                //最终要关闭流资源，避免造成资源浪费
//                try {
//                    inputStream.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//            if (outputStream != null) {
//                try {
//                    outputStream.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            }
//        }


        //把资源定义放在Try小括号中
        try(
                //建立文件输入流
            InputStream inputStream = new FileInputStream("C:\\Users\\17675\\Desktop\\222.jpg");

                //建立文件输出流
            FileOutputStream outputStream = new FileOutputStream("C:\\Users\\17675\\Desktop\\333.jpg")) {

            long start = System.currentTimeMillis();
            byte[] buf = new byte[1024*1024];
            int len;
            while((len = inputStream.read(buf)) != -1){
                //从buf当中读，每回从0开始写到第len个
                outputStream.write(buf, 0, len);
            }
            long end = System.currentTimeMillis();
            System.out.println(end - start);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    /**
     * 对象序列化与反序列化
     * 我们的实例对象是内存中的二进制代码，在实际系统中会存在不同业务模块之间进行对象的传递；
     * 就需要将对象序列化储存在磁盘中或者转换到流当中，然后需要端在反序列化成内存对象
     */
    //序列化
    public void objectTest1() throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\17675\\Desktop\\333.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        objectOutputStream.writeObject(new User("lq",24,new Dog("tidy",10)));
        objectOutputStream.flush();
        fileOutputStream.close();
        objectOutputStream.close();

    }

    //反序列化
    public void objectTest2() throws IOException, ClassNotFoundException {
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\17675\\Desktop\\333.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

        Object o = objectInputStream.readObject();
        System.out.println(o);
        fileInputStream.close();
        objectInputStream.close();
    }

    @Test
    /**
     * 深拷贝与浅拷贝
     */
    //浅拷贝
//    public void qianCopyTest(){
//        //浅拷贝只是给了你引用地址，其他有这个地址的变量修改内容，会同时影响所有指向这个地址的变量
//        User liuqiang = new User("liuqiang", 24, new Dog("tidy",10));
//        User other = liuqiang;
//        other.setName("hahah");
//
//        System.out.println(liuqiang.getName() + " " + liuqiang.getAge());
//    }

    //深拷贝，把地址内容重写复制一份放到另一个地方，这样其他指向这里的引用就不会影响了
    public void deepCopyTest() throws IOException, ClassNotFoundException {
        //就是把user对象使用序列化输出流输出到byte数组中
        User liuqiang = new User("liuqiang", 24, new Dog("tidy",10));

//        //将对象写到字节数组中
//        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
//        objectOutputStream.writeObject(liuqiang);
//
//        //获取字节数组
//        byte[] byteArray = byteArrayOutputStream.toByteArray();
//
//        //反序列化用输入流读出来
//        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);
//        ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
//        Object o = objectInputStream.readObject();
//        User user = (User) o;
        User user = DeepCopyUtil.deepCopy(liuqiang);

        liuqiang.setName("hahaha");
        liuqiang.setAge(25);
        System.out.println(user.getName() + " " + user.getAge());


    }
}
